/**
 * @file SerialStrategy.h
 * @brief 串口通信策略实现
 * @author Your Name
 * @date 2025-03-30
 */

#ifndef SERIALSTRATEGY_H
#define SERIALSTRATEGY_H

#include "icommunicationstrategy.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>

/**
 * @brief 串口通信策略类
 * @details 实现串口通信方式
 */
class SerialStrategy : public ICommunicationStrategy {
    Q_OBJECT
public:
    explicit SerialStrategy(QObject *parent = nullptr);
    ~SerialStrategy() override;

    /**
     * @brief 初始化串口通信
     * @param config 配置参数，包含port(串口名)、baudRate(波特率)等
     * @return 是否初始化成功
     */
    bool init(const QVariantMap& config) override;

    /**
     * @brief 打开串口连接
     * @return 是否成功打开
     */
    bool open() override;

    /**
     * @brief 关闭串口连接
     */
    void close() override;

    /**
     * @brief 发送数据
     * @param data 要发送的数据
     * @return 实际发送的字节数
     */
    qint64 send(const QByteArray& data) override;

    /**
     * @brief 是否已连接
     * @return 串口连接状态
     */
    bool isConnected() const override;

    /**
     * @brief 获取可用串口列表
     * @return 串口信息列表
     */
    static QList<QSerialPortInfo> getAvailablePorts();

private slots:
    /**
     * @brief 处理串口数据
     */
    void handleReadyRead();

    /**
     * @brief 处理串口错误
     * @param error 错误类型
     */
    void handleError(QSerialPort::SerialPortError error);

    /**
     * @brief 检测串口连接状态
     */
    void checkConnection();

private:
    QSerialPort m_serialPort;          ///< 串口对象
    QTimer m_connectionCheckTimer;     ///< 连接检查定时器
    bool m_lastConnectedState;         ///< 上次连接状态
    QVariantMap m_config;              ///< 配置参数
};

#endif // SERIALSTRATEGY_H
